AppManifestモジュールについて


概要

アプリケーションの設定ファイルを読み書きする機構。

Autoyaのモジュールの一つ。

https://github.com/sassembla/Autoya/tree/master/Assets/Autoya/Manifest



重要な制約として、string以外の型を保持できないようにしてある。


サンプル

https://github.com/sassembla/Autoya/blob/master/Assets/AutoyaSample/10_AppManifest/AppManifest.unity


おまけで、UnityCloudBuild上でビルドした場合、

CloudBuildのパラメータも取り込んだ情報を取得できるようにしてある。(もしかしたら動いてないかも)


あとshellからビルドメッセージを入れたりできる。



用途

アプリケーションの運用に際して、事前に定義したパラメータを管理するのに特化している。

アプリケーションの運用以外に関するパラメータを管理するために使うのは得策では無い。



アプリケーションで保持、管理したいパラメータ

1.ビルド時に決定されるreadonlyなパラメータ

2.ビルド時に初期値が決定され、更新されるパラメータ

3.動作時に新規に追加、上書きされていくパラメータ


だいたいこの三つがあると思う。

AppManifest機構では、1と2を扱う。3はInAppDBなどで扱う。


1.ビルド時に決定されるreadonlyなパラメータ

アプリケーションのバージョン、ビルド時の情報など、

外部から参照して使うのみのパラメータ。


よくタイトル画面に表示したりする。

パラメータ名から値までが完全に決定された状態。



2.ビルド時に初期値として決定され、それ以降更新されるパラメータ

事前にキーが決まっているパラメータ。

外部から参照して使うほか、更新が発生したりする。


事前にキーが決まっており、深度も決定されているが、変更が発生することがあるのが1との違い。


予期されている範囲での変動を保持する。


3.動作時に新規に追加、上書きされていくパラメータ

1,2以外のクライアント側でのpersistantな要素。

要はDB。

キーが増えたり、深度が変わったりする。初期値もあったりなかったり。

真面目な運用を考えるとまあ可変キー、可変深度になると思う。

型も多岐にわたる。



AppManifest

次のような階層構造になっている


AppManifestStore

┣ BuildManifest

ビルド時に決定されるパラメータ集

┗ RuntimeManifest

ビルド時に初期値として決定され、それ以降更新されるパラメータ集

で、


取り出しはAppManifestStore経由で、辞書形式で取得できるようになっている。

RuntimeManifestパラメータに関しては、取り出し -> 変更 -> 上書き、ができる。


read/writeに関する機構は外部から渡すことができる(暗号化/復号化フック書ける)

BuildManifest、RuntimeManifestに使用するデータ型は外部から渡す。



それぞれの保存形式


BuildManifest

実行時書き換え機構を持たないため、まんまResourcesフォルダ以下にjson形式で保存されている。

RuntimeManifest

実行時書き換え機構を持つため、アプリケーションの実行環境に保存される。

保存メソッドは外部から与えることができる。


両方とも、生成元となる型を与えて生成するデータの形状を規定する。

生成元の型情報に初期値をセットすることができる。


重要な制約として、string以外の型を保持できない。



Autoyaでの使用例

Autoyaでは、2つのバージョン値を使ってユーザーの手元のゲームを管理できるようになっている。


appVersion

アプリケーションのバージョン


resVersion

リソースのバージョン


appVersion

appVersionはアプリケーションの実行バイナリの更新でのみ変動するため、

BuildManifestのパタメータとして保持している。

認証がある通信に際して、サーバ側にクライアントアプリのバージョンを通知するために使っている。

サーバはこの通知をもとに、「君のアプリは古い。こっちを使いなさい」とか返答を寄越してくる。



resVersion

resVersionはアプリケーションが現在保持しているDL可能リソース全体のバージョンを表象している。

これはアプリの運用中に変化していく(だいたいincrementされる)ため、

RuntimeManifestのパラメータとして保持している。


認証がある通信に際して、サーバ側にクライアントのDL済みのリソースバージョンを通知するために使っている。

サーバはこの通知をもとに、「君のアプリのリソース情報は古い。こっちを使いなさい」とか返答を寄越してくる。